#pragma once

#include <string>
#include <functional>
#include <utility>

namespace threadpool {

    /*
     * PriorityTask 优先级任务
     * TimedTask    定时任务
     * PeriodicTask 周期任务
     * SuicideTask  线程自杀任务
     */

    class Task {

    public:

        /**
          * @brief  根据指定的优先级和任务函数创建任务
          * @param  priority 优先级
          * @param  func     任务函数
          */
        explicit Task(int priority, std::function<void()> func) :
                priority_(priority), func_(std::move(func)) {}

        /**
          * @brief  执行任务函数
          */
        virtual void execute() const { func_(); }

        /**
          * @brief  获取任务类型
          * @note   纯虚函数需要重写
          * @retval 任务类型
          */
        virtual std::string getType() const = 0;

        /**
          * @brief  获取任务优先级
          * @retval 任务优先级
          */
        int getPriority() const { return priority_; }

        /**
          * @brief  设置任务优先级
          * @param  priority 任务优先级
          */
        void setPriority(int priority) { priority_ = priority; }

    private:

        // 任务函数
        std::function<void()> func_;

        // 任务优先级
        int priority_;

    };

}